package projeto.telas;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

import projeto.dao.IProdutoDAO;
import projeto.dao.ProdutoDAOJDBC;
import projeto.exception.PersistenceException;
import projeto.model.Produto;

/**
 * Tela principal da aplicação. Apresenta uma lista com as Produtos cadastradas. 
 * 
 * <p>A partir dessa tela eh possivel criar/editar ou pesquisar Produto.</p>
 * 
 * @author YaW Tecnologia
 */
public class ListaProdutosFrame extends JFrame {
	
	private ProdutoTable tabela;
	private JScrollPane scrollPane;
	private JButton bNovaProduto;
	private JButton bBuscarProduto;
	private JButton bAtualizaLista;
	private JMenuBar menubar;
	
	private IncluirProdutoFrame incluirFrame;
	private EditarProdutoFrame editarFrame;
	private BuscaProdutoFrame buscaFrame;
	private SobreFrame sobreFrame;
	
	public ListaProdutosFrame() {
		setTitle("Lista de Produto");
		
		inicializaComponentes();
		adicionaComponentes();
		
		pack();
		setLocationRelativeTo(null);
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}

	private void inicializaComponentes() {
		tabela = new ProdutoTable();
		tabela.addMouseListener(new EditarProdutoListener());
		scrollPane = new JScrollPane();
		scrollPane.setViewportView(tabela);

		bNovaProduto = new JButton();
		bNovaProduto.setText("Nova");
		bNovaProduto.setMnemonic(KeyEvent.VK_N);
		bNovaProduto.addActionListener(new IncluirProdutoListener());

		bBuscarProduto = new JButton();
		bBuscarProduto.setText("Buscar");
		bBuscarProduto.setMnemonic(KeyEvent.VK_B);
		bBuscarProduto.addActionListener(new BuscarProdutoListener());
		
		bAtualizaLista = new JButton();
		bAtualizaLista.setText("Atualizar");
		bAtualizaLista.setMnemonic(KeyEvent.VK_A);
		bAtualizaLista.addActionListener(new AtualizarListaListener());
		
		menubar = new JMenuBar();
		MenuF1 mAjuda = new MenuF1("Ajuda");
		mAjuda.setMnemonic(KeyEvent.VK_J);
        JMenuItem miSobre = new JMenuItem("Sobre    - F1");
        miSobre.addActionListener(new SobreMenuListener());
        mAjuda.addListener(new SobreMenuListener());
        mAjuda.add(miSobre);
        menubar.add(mAjuda);
        setJMenuBar(menubar);
		
		incluirFrame = new IncluirProdutoFrame(this);
		editarFrame = new EditarProdutoFrame(this);
		buscaFrame = new BuscaProdutoFrame(this);
		sobreFrame = new SobreFrame();
		
		inicializaDB();
	}
	
	private void adicionaComponentes(){
		add(scrollPane);
		JPanel panel = new JPanel();
		panel.add(bNovaProduto);
		panel.add(bBuscarProduto);
		panel.add(bAtualizaLista);
		add(panel, BorderLayout.SOUTH);
	}
	
	private void inicializaDB() {
		try {
			new ProdutoDAOJDBC().init();
			SwingUtilities.invokeLater(newAtualizaProdutosAction());
		} catch (PersistenceException ex) {
			JOptionPane.showMessageDialog(this, "Não foi possível inicializar o Banco de dados: "+
					ex.getMessage()+"\nVerifique a dependência do driver ou configurações do banco!", "Erro", JOptionPane.ERROR_MESSAGE);
			System.exit(0);
		}
	}
	
	public Runnable newAtualizaProdutosAction() {
		return new Runnable() {
			public void run() {
				try {
					IProdutoDAO dao = new ProdutoDAOJDBC();
					tabela.reload(dao.listaTodos());
				} catch (PersistenceException ex) {
					JOptionPane.showMessageDialog(ListaProdutosFrame.this,
							ex.getMessage(), "Erro ao consultar Produto(s)", JOptionPane.ERROR_MESSAGE);
				}
			}
		};
	}
	
	public void refreshTable(List<Produto> Produtos) {
		tabela.reload(Produtos);
	}
	
	private class AtualizarListaListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			SwingUtilities.invokeLater(newAtualizaProdutosAction());
		}
	}
	
	private class IncluirProdutoListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			incluirFrame.setVisible(true);
		}
	}
	
	private class EditarProdutoListener extends MouseAdapter {
		public void mouseClicked(MouseEvent event) {
			if (event.getClickCount() == 2) {
				Produto m = tabela.getProdutoSelected();
				if (m != null) {
					editarFrame.setProduto(m);
					editarFrame.setVisible(true);
				}
			}
		}
	}
	
	private class BuscarProdutoListener implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			buscaFrame.setVisible(true);
		}
	}
	
	private class SobreMenuListener extends AbstractAction implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			sobreFrame.setVisible(true);
		}
	}

}
